/**
 * 验证码倒计时
 * @作者: 陈老师儿~
 * @手机: 18560000860
 */

import { ref, unref, onMounted, onBeforeUnmount } from "vue";

// key: 验证码的key，用于区分不同的验证码
// seconds: 倒计时时长，单位秒，默认为60秒
// endFn: 倒计时结束后的回调函数，默认为空函数
export function usePureCodeCountdown(key = "", seconds = 60, endFn = () => {}) {
	// 获取静态值
	seconds = unref(seconds);

	// 倒计时时长
	const _seconds = ref(seconds);

	// 定时器
	let timer = null;

	// 存储缓存的key
	const keyName = "pure_code_countdown_" + key;

	// 倒计时状态
	const isCountdown = ref(false);

	// 组件挂载时
	onMounted(() => {
		// 查找缓存的数据
		const cacheData = findCacheData();

		// 有缓存的数据
		if (cacheData) {
			// 继续倒计时
			goon(cacheData);
		}
	});

	// 组件卸载时
	onBeforeUnmount(() => {
		// 清除定时器
		clearTimer();
	});

	// 开始
	function start() {
		// 正在倒计时
		if (isCountdown.value) return;

		// 设置定时器，开始倒计时
		setTimer();
	}

	// 设置定时器，开始倒计时
	function setTimer() {
		// 先清除一下定时器
		clearTimer();

		// 更新倒计时状态
		isCountdown.value = true;

		// 缓存数据
		setCacheData();

		// 设置定时器，开始倒计时
		timer = setInterval(() => {
			// 倒计时结束
			if (_seconds.value <= 0) {
				// 清除定时器
				clearTimer();

				// 清除缓存数据
				clearCacheData();

				// 更新倒计时秒数
				_seconds.value = seconds;

				// 调用倒计时结束回调函数
				callEndFn();

				return;
			}

			// 倒计时减1
			_seconds.value--;

			// 缓存数据
			setCacheData();
		}, 1000);
	}

	// 清除定时器
	function clearTimer() {
		if (timer) {
			clearInterval(timer);
			timer = null;
		}

		// 更新倒计时状态
		isCountdown.value = false;
	}

	// 查找缓存的数据
	function findCacheData() {
		// 未设置key，不查找
		if (!key) return null;

		// 查找缓存的数据
		const storageData = uni.getStorageSync(keyName);
		return storageData;
	}

	// 缓存数据
	function setCacheData() {
		// 未设置key，不缓存
		if (!key) return;

		// 缓存数据
		const storageData = {
			seconds: _seconds.value,
			timestamp: Date.now(),
		};
		uni.setStorageSync(keyName, storageData);
	}

	// 清除缓存数据
	function clearCacheData() {
		// 未设置key，不缓存
		if (!key) return;

		// 清除缓存数据
		uni.removeStorageSync(keyName);
	}

	// 继续倒计时
	function goon(cacheData) {
		const { seconds: goonSeconds, timestamp } = cacheData;

		// 当前时间戳
		const nowTimestamp = Date.now();

		// 过去了多少秒
		const passSeconds = Math.ceil((nowTimestamp - timestamp) / 1000);

		// 还在倒计时范围内
		if (passSeconds <= goonSeconds) {
			// 更新倒计时秒数
			_seconds.value = goonSeconds - passSeconds;

			// 设置定时器，开始倒计时
			setTimer();

			return;
		}

		// 走完了
		_seconds.value = seconds;
		isCountdown.value = false;
		clearTimer();
		clearCacheData();
	}

	// 调用倒计时结束回调函数
	function callEndFn() {
		if (typeof endFn === "function") {
			endFn();
		}
	}

	return {
		seconds: _seconds,
		isCountdown,
		start,
		clear: clearCacheData,
	};
}
